Determinar si el nivel del CDS de un paĆs tiene poder predictivo sobre la calificación del soberano de ese paĆs. El problema se puede plantear desde varios puntos de vista.
Definimos \(X_i(t)\) el valor del CDS del paĆs \(i\) en el tiempo \(t\).
# carga el objeto data:
load("rvbasederatingsycds/Base_Histórico_RC.Rda")
head(data)
Fecha Country Rating CDS Rating_Num
1 2010-09-13 Corea del Sur A 105.9430 17
2 2012-12-26 Eslovaquia A 100.7669 17
3 2010-08-12 Corea del Sur A 109.6306 17
4 2010-09-12 Corea del Sur A 104.3209 17
5 2012-04-17 Eslovaquia A 238.8106 17
6 2011-07-27 Israel A 140.9389 17
ratings <- c("CCC-","CCC","CCC+","CC","BBB-","BBB","BBB+","BB-","BB","BB+","B-","B","B+","A-","A","A+","AA-","AA","AA+","AAA")
# Categorización de los ratings:
datos <- data %>%
mutate(fecha = as.Date(Fecha, format = "%Y-%m-%d"),
semana = week(fecha),
aƱo = year(fecha),
Rating = factor(Rating,ordered = T,levels = ratings),
Country = factor(Country),
Rating_simple = fct_relevel(
fct_collapse(Rating,
"AAA" = c("AAA"),
"AA" = c("AA","AA+","AA-"),
"A" = c("A","A-","A+"),
"BBB" = c("BBB","BBB-","BBB+"),
"BB" = c("BB","BB-","BB+"),
"B" = c("B","B+","B-"),
"CCC" = c("CC","CCC","CCC-","CCC+")),
c("AAA","AA","A","BBB","BB","B","CCC")),
logCDS = log(1+ CDS)) %>%
group_by(Country) %>%
arrange(Country, fecha) %>%
dplyr::select(- Fecha)
Los nĆŗmeros de observaciones que cae en cada rating (ignorando de quĆ© paĆs vienen son los siguientes:
# Originales
fct_count(datos$Rating)
# A tibble: 20 x 2
f n
<ord> <int>
1 CCC- 103
2 CCC 486
3 CCC+ 1022
4 CC 379
5 BBB- 15294
6 BBB 13863
7 BBB+ 8918
8 BB- 8942
9 BB 12314
10 BB+ 10778
11 B- 9425
12 B 5308
13 B+ 10767
14 A- 7335
15 A 3832
16 A+ 9333
17 AA- 9212
18 AA 11176
19 AA+ 5193
20 AAA 20453
# Colapsados
fct_count(datos$Rating_simple)
# A tibble: 7 x 2
f n
<ord> <int>
1 AAA 20453
2 AA 25581
3 A 20500
4 BBB 38075
5 BB 32034
6 B 25500
7 CCC 1990
# convierte a escala logaritmica para simplificar
paises <- levels(datos$Country) #lista de paĆses en la muestra
npaises <- length(paises)
#str(datos)
Vistos como series temporales y algunos ejemplos de las series con los ratings originales:
p <- paises[6]
datos %>% filter(Country == p) %>%
ggplot(aes(x = fecha, y = logCDS, color = Rating, group=1)) +
geom_path() +
labs(title = p)
datos %>% ggplot(aes(x = fecha, y = logCDS, color = interaction(Country, Rating_simple), group = Country)) +
geom_line() +
theme(legend.position = "none")
Considera las distribuciones condicionales en cada tiempo \(t\).
anuales <- 2010:2019
for(y in anuales){
datosmex <- datos %>%
filter(Country == "MƩxico", aƱo == y, semana %in% 1:52) %>%
group_by(Rating_simple)
p <- datos %>%
filter(aƱo == y, semana %in% 1:52) %>%
group_by(Rating_simple) %>%
ggplot(aes(x = Rating_simple, y = logCDS)) +
geom_boxplot(aes(y = logCDS,color = Rating_simple)) +
geom_violin(data = datosmex,aes(x = Rating_simple, y = logCDS),
color = "red", alpha = 0.2,draw_quantiles = 0.5) +
facet_wrap(~ semana,nrow = 4) +
labs(title = paste("AƱo:",y))
theme(legend.position = "none", text = element_text(size=10))
print(p)
}
Se calcula el p-value de la prueba estadĆstica de que la calificación de MĆ©xico pertenezca a un cierto rating en una fecha dada (agrupando por meses), a travĆ©s de una prueba de permutación (no paramĆ©trica), comparando las observaciones de MĆ©xico y las de la distribución de observaciones que pertenecen a cada categorĆa en esa fecha dada.
rating <- "BB"
datossem <- datos %>%
na.omit() %>%
filter(aƱo == 2010, semana == 1, Rating_simple == rating) %>%
group_by(Rating_simple) %>%
dplyr::select(fecha, aƱo, semana, Rating_simple,logCDS) %>%
(function(x)x$logCDS)
mexico <- datos %>%
filter(aƱo == 2010, semana == 1, Country == "MƩxico") %>%
dplyr::select(Country,logCDS) %>%
(function(x)x$logCDS)
#%>%
#summarise(mediana = median(logCDS,na.rm = T)) %>%
#(function(x)x$mediana)
prueba.permutacion <- function(x,y,L = 3000){
delta <- NULL
n1 <- length(x)
n2 <- length(y)
stat <- median(x)-median(y)
for(i in 1:L){
permutacion <- sample(c(x,y),size = n1+n2)
delta[i] <- median(permutacion[1:n1]) - median(permutacion[(n1+1):(n1+n2)])
}
pval <- sum(abs(delta)>abs(stat))/L
return(pval)
}
CƔlculo de p-values:
calificaciones <- c("AAA","AA","A","BBB","BB","B","CCC")
A <- data.frame()
k <- 0
for(calif in calificaciones){
for (a in anuales){
for (s in 1:52){
k <- k + 1
datossem <- datos %>%
na.omit() %>%
filter(aƱo == a, semana == s, Rating_simple == calif) %>%
group_by(Rating_simple) %>%
dplyr::select(fecha, aƱo, semana, Rating_simple, logCDS) %>%
(function(x)x$logCDS)
mexico <- datos %>%
filter(aƱo == a, semana == s, Country == "MƩxico") %>%
dplyr::select(Country,logCDS) %>%
(function(x)x$logCDS)
pval <- prueba.permutacion(datossem,mexico,L=3000)
A <- rbind(A,data.frame(rating = calif,
aƱo = a,
semana = s,
pvalue = pval))
#print(c(a,s,calif,pval))
}
}
}
A %>% ggplot(aes(x=aƱo+semana/52, y=pvalue, color=rating)) +
geom_path() +
geom_point() +
geom_hline(yintercept = 0.05, color = "red") +
labs(title = "p-values de pertenecer a cierta calificación",subtitle = "datos agregados semanalmente")